home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat08 / sysinfo / sysinfo.s < prev    next >
Encoding:
Text File  |  1993-02-08  |  9.2 KB  |  215 lines

  1. * programme : SysInfo.s : delivre la charge du systeme, s'utilise
  2. * exclusivement sous le Shell (ou le CLI).
  3. * BUT:  Avez vous remarquez que la commande "status" n'est capable de
  4. * délivrer que les noms des taches lancées a partir Shell. Tous les autres
  5. * programmes sont simplement escamotés. Cette limite m'a souvent fait
  6. * défaut. Donc, aprés m'etre inspiré du programme de la page 273 du RKM
  7. * "libraries & devices" (systeme 1.3) j'ai créé ce petit (800 octets)
  8. * pour non seulement afficher les taches mais aussi les librairies, les
  9. * devices et ressources.
  10. * Le programme s'utilise comme suit:
  11. * 1> SysInfo option <,option..)
  12. *     avec option d : pour afficher la liste des DEVICES
  13. *           l : pour les LIBRAIRIES                   
  14. *           r : pour les RESSOURCES
  15. *           t : pour les TACHES en ATTENTE (WAITING)
  16. * exemple : sysinfo dl   ou   sysinfo d l :affichera les devices et libraries.
  17.  
  18. * L'ordre des argument peut etre quelconque, on peut mettre plusieurs
  19. * fois le même argument. Les d'arguments peuvent ou non etre separés par
  20. * un ou des blancs. Si l'on passe trop (plus de 8) arguments ou un ou plusieurs
  21. * arguments inconnus parmis des arguments connus, on obtiendra un message
  22. * de syntaxe.
  23. * PRINCIPE: On analyse le nb d'args passés puis leur valeur. On positionne une
  24. * valeur booléenne (table ArgValid) si un arg est reconnu. Ensuite on analyse
  25. * la tables des arguments valides et l'on va chercher les adresses des noms des
  26. * entités (device, libraries, resources & task) si besoins est. Les adresses 
  27. * sont stockées sur la pile. A chaque valeur booléenne positionnée, on
  28. * introduira une entete et des caracteres de controle pour mettre un peu de
  29. * couleur a l'ecran. A la suite de ce travail, on se reserve de la memoire pour
  30. * constituer le fichier des noms (celui qui sera affiché).
  31. * Pour rechercher les noms, on doit interdire les interruptions (fonction
  32. * Enable).attention, les interruptions sont suspendues pendant 250µs seulement.
  33. * Ce temps doit etre exploiter au maximum. En 250µs, avec une machine
  34. * fonctionnant a 7MHz, on a environ 1750 coups d'horloge. Si on en laisse 250
  35. * au systeme il nous en reste 1500 (le calcul est fait avec un 68000)
  36. * Comme la boucle de recopie des adresses prend 16+12+4+10 = 42 coups d'horloge,
  37. * on pourra copier 1500/42 = 36 adresses donc autant de noms.
  38. * La taille du fichier des adresses est donc calculée comme suit : 
  39. * 4*40*4 avec 4: car 4 listes possibles (d,l,r,t) 
  40. *        40: 36+4  : nb d'adresses + entete
  41. *         4: car un adresse a besoin de 4 octets
  42. *BUGS: si l'on active l'option l, on ne trouve pas l'exec.library ?
  43. *      Il y a 2 "," en trop par liste affichée (mais ce n'est pas genant.         
  44.  
  45. * fait sous Devpac2.15, Amiga 500, 512ko Chip et 512ko Fast.
  46. * Auteur : Tilagone Christophe, 2 rue Jean le Bail 87100 LIMOGES (FRANCE).
  47. * derniere modification : Mercredi 9 Septembre 1992
  48.  
  49.     opt    o+,ow-        ; optims maximales + warning
  50.  
  51.     incdir    "Devpac2:include/"
  52. *    incdir    "rad:"
  53.     include    "libraries/dos_lib.i"
  54.     include    "exec/execbase.i"
  55.     include    "exec/nodes.i"
  56.     include    "exec/lists.i"
  57.     include    "exec/strings.i"
  58.     include    "exec/memory.i"
  59.     include    "exec/exec_lib.i"
  60.     include    "misc/easystart.i"
  61.  
  62. DataSize        equ 4*40*4    ; taille du fichier des adresses
  63. NameFileSize    equ 4*40*25    ; taille du fichier des noms
  64.  
  65. *================= Programme principal ==============================
  66. SaveArg    move.l    a0,ArgPtr    ; sauver ptr sur arguments
  67.     move.w    d0,ArgNmbr    ; sauver nb d'arguments passés
  68. MemAdr    link    a5,#-DataSize    ; demander octets sur pile..
  69.     move.l    a5,OldA5        ; pour stocker les adresses des noms
  70.     
  71. DOSLib    lea    DOSName(pc),a1
  72.     CALLEXEC    OldOpenLibrary    ; ouvrir la dos.library
  73.     move.l    d0,_DOSBase    ; et sauver son pointeur
  74.     beq    NoDOS        ; pas de DOS ?
  75. StdOut    CALLDOS    Output        ; chercher la Sortie Standard
  76.     move.l    d0,StdrOut    ; et la sauver
  77.  
  78. *================== Controle des arguments ==========================
  79. FindArg    move.w    ArgNmbr(pc),d0    ; charger le nombre d'args
  80.     subq.w    #(1+1),d0    ; calculer nb réel d'args + -1 pour DBF
  81.     bmi    Error        ; pas d'argument passé
  82.     cmpi.w    #(2*4-1),d0    ; comparer a nb maxi d'argautorisé
  83.     bpl    Error        ; si trop d'arguments passés: syntaxe
  84.  
  85. Analyse    movea.l    ArgPtr(pc),a0    ; charger l'adresse des arguments
  86. loop1    cmpi.b    #" ",(a0)+    ; rechercher les " " dans la chaine ..
  87.     dbne    d0,loop1        ; et les sauter
  88.     lea    ArgList(pc),a1    ; adresse de la liste des args valides
  89.     moveq    #(4-1),d1    ; nb d'arg valides
  90. loop2    move.b    -1(a0),d2    ; charger UN arg passé..
  91.     cmp.b    (a1)+,d2        ; et le comparer a ceux de la liste..
  92.     dbeq    d1,loop2        ; jusqu'a le reconnaitre
  93.     tst.w    d1        ; si d1=-1 alors l'arg passé est <> de..
  94.     bmi    Error        ; ceux connus donc : syntaxe
  95.     move.b    #$ff,(6-1)(a1)    ; sinon positionner indicateur de validité
  96. NextArg    dbf    d0,loop1        ; il faut analyser tous les args
  97.  
  98. *================== Recherche des adresses des noms ================= 
  99. TakeAdr    lea    ArgValid(pc),a0    ; charger table des arguments passés
  100.     lea    OffstLst(pc),a1    ; charger table des offsets
  101.     movea.l    _SysBase,a2    ; adresse d'Exec
  102.     moveq    #(4-1),d0    ; 4 "header" possibles
  103. loop3    tst.b    (a0)+         ; tester validité arguments
  104.     dbne    d0,loop3     ; sauter les args non validés    
  105.     tst.w    d0        ; si d0=-1 alors tous les args ont été
  106.     bmi.s    NameMem        ; reconnus donc on va copier le noms
  107.     moveq    #(4-1),d1
  108.     sub.l    d0,d1        ; calculer l'offset de la table d'offsets
  109.     lsl.l    #1,d1        ; *2 car offsets sur .w
  110.  
  111.     move.l    d1,d2        ; introduction de l'entete
  112.     lsl.l    #1,d2        ; d1*4=d2*2 car offset d'entete  sur .l
  113.     move.l    #ColorOn,-(a5)    ; passer en orange pour l'entete
  114.     move.l    8(a1,d2.l),-(a5)    ; adresse du nom de l'entete
  115.     move.l    #ColorOff,-(a5)     ; passer en blanc
  116.     
  117.     move.w    (a1,d1.l),d1    ; extraire l'offset de liste 
  118.     movea.l    (a2,d1.l),a4    ; chercher le "header" de la liste ..
  119.     movea.l    LH_HEAD(a4),a4    ; et prendre le 1er node de la liste
  120.     bsr    CopyAdr        ; puis recuperer tous les noms de la liste
  121.     dbf    d0,loop3        ; et boucler si necessaire
  122.  
  123. *================== Copie des nom dans un fichier ===================
  124. NameMem    move.l    #NameFileSize,d0    ; taille mémoire maxi du fichier des noms
  125.     move.l    #(MEMF_CLEAR|MEMF_PUBLIC),d1
  126.     CALLEXEC    AllocMem        ; allouer mémoire pour les noms
  127.     move.l    d0,FileAdr    ; et sauver le pointeur sur le fichier
  128.     beq    NoDOS        ; si d0=0 alors pas de ram ?
  129.  
  130.     movea.l    d0,a0        ; adresse du fichier des noms
  131.     movea.l    OldA5(pc),a1    ; adresse de debut du fichier adresses
  132.     moveq    #-1,d3        ; compteur de char (pour Write)
  133. NextName    movea.l    -(a1),a2        ; charger l'adresse d'un nom
  134. .loop    move.b    (a2)+,(a0)+    ; copier un nom char a char
  135.     beq.s    EndName        ; si char copier = 0, inserer séparateur
  136.     cmpi.b    #".",-1(a0)    ; si char copier = ., inserer séparateur
  137.     dbeq    d3,.loop        ; sinon compter le char copier & boucler
  138. EndName    move.b    #",",-1(a0)    ; inserer un caractere de séparation
  139.     cmpa.l    a1,a5        ; faire toute la liste des adresses
  140.     dbpl    d3,NextName    ; compter char séparateur & boucler
  141.  
  142.     move.b    #CR,-(a0)    ; inserer CR+LF pour replacer le curseur..
  143.     move.b    #LF,(a0)+    ; en debut de ligne
  144.     move.b    #LF,(a0)        ; LF facultatif mais + esthetique
  145.     subq.l    #3,d3        ; ajouter 3 char au compteur (CR+2*LF)
  146. Affiche    neg.l    d3        ; d3 = nb de char dans le fichier
  147.     move.l    StdrOut(pc),d1    ; sortie standard dans d1
  148.     move.l    FileAdr(pc),d2    ; adresse du fichier des nom dans d2
  149.     CALLDOS    Write        ; et afficher le fichier des noms
  150.     bra.s    Fin        ; comme pas d'erreur, liberer ressources
  151.  
  152. *================== Message de syntaxe ==============================
  153. Error    move.l    StdrOut(pc),d1
  154.     move.l    #SynTexte,d2
  155.     move.l    #(EndSyTxt-SynTexte),d3
  156.     CALLDOS    Write        ; afficher syntaxe du prgm
  157.     bra.s    NoDOS
  158.  
  159. *================== Libération des ressources =======================
  160. Fin    movea.l    FileAdr(pc),a1
  161.     move.l    #NameFileSize,d0    ; taille du fichier des noms
  162.     CALLEXEC    FreeMem
  163. NoDOS    movea.l    _DOSBase(pc),a1    ; fermer la DOS.library
  164.     CALLEXEC    CloseLibrary
  165. NoBuffer    movea.l    OldA5(pc),a5    ; liberer pile
  166.     unlk    a5    
  167. NoMem    moveq    #0,d0        ; code de retour
  168.     rts
  169.  
  170. *================== CopyAdr =========================================
  171. * données mod : a3 : fichier des adresses.
  172. *           a4 : pointeur sur la liste a traiter.
  173. * traitement  : Copie les adresses des noms dans le fichier
  174. *           geré par a3.
  175. CopyAdr    CALLEXEC    Forbid        ; 250µs sans interruption
  176. .loop    move.l    LN_NAME(a4),-(a5)    ; recopier l'adresse du nom
  177.     movea.l    LN_SUCC(a4),a4    ; chercher le nom suivant
  178.     move.l    a4,d3        ; car movea ne positionne pas les flags
  179.     bne.s    .loop        ; boucler tant que SUCC <> 0
  180.     CALLEXEC    Permit        ; rétablir les interruptions
  181.     adda.l    #4,a5        ; corriger pile (pour compenser LH_TAIL)
  182.     rts            ; et partir
  183.  
  184. *================== Variables & Données =============================
  185. _DOSBase    dc.l 0        ; pointeur sur la DOS
  186. StdrOut    dc.l 0        ; sortie standard
  187. OldA5    dc.l 0        ; pour unliker
  188. FileAdr    dc.l 0        ; adresee du fichier des noms
  189. DOSName    dc.b "dos.library",0
  190.     even
  191. ArgPtr    dc.l 0        ; adresse des arguments passés au prgm
  192. ArgNmbr    dc.w 0        ; nombre   d'    "
  193. ArgList    dc.l "dlrt"    ; liste des arguments connus
  194.     dc.w 0
  195. ArgValid    dc.w 0,0,0    ; indicateurs des arguments a traiter
  196. OffstLst    dc.w DeviceList    ; offsets des liste par rapport a ExecBase
  197.     dc.w LibList
  198.     dc.w ResourceList
  199.     dc.w TaskWait
  200. Entetes    dc.l HeadDevc,HeadLib,HeadRes,HeadWait
  201.  
  202. SynTexte    dc.b CR,LF,"SYSINFO: option <,option..>",CR,LF
  203.     dc.b "     Device, Librairie, Ressource, Tâche",CR,LF
  204. EndSyTxt    
  205.     even
  206. ColorOn    dc.b CR,LF,$9B,"0;33;40m",0    ; passer en orange
  207. ColorOff    dc.b BS,$9B,"0;31;40m",0        ; passer en blanc
  208. HeadDevc    dc.b BS,"Devices   :",0
  209. HeadLib    dc.b BS,"Librairies:",0
  210. HeadRes    dc.b BS,"Ressources:",0
  211. HeadWait dc.b BS,"Task Wait :",0
  212.  
  213.     END
  214.  
  215.